闲扯
$NOIP2018$ 的 $D1T3$ ,咕了快一年了,终于过来做了。。
题面
Solution
要让最小的最大,考虑二分答案。
因为每条边只能走一次,所以每个节点最多只能向上传递一段赛道。
在子树中,如果一条赛道已经达到了我们的要求,我们就直接将其纳入最后的方案中。因为如果继续向它里面加赛道,并不会让答案更优。
对于不能达到要求的赛道,暂时保留,如果有两条赛道拼到一起可以满足要求,我们也直接将其纳入最后的方案。
对于每条长度不够的赛道,我们从小到大枚举,然后找出一条最小的,与它拼接后可以达到要求的来组合。因为大的无论是向上传递还是与其他的赛道拼接肯定都比小的好。
对于剩下的没法拼接的赛道,我们选出一条最长的来向上传递,这样可以使得拼出新赛道的概率更大。
以上决策都是基于贪心的思想的。
对于每颗子树的维护,我们因为要排序,还要找最接近需求的赛道,可以想到用 $set$ 和其自带的 $lower_bound$ 来维护。因为可能有多条长度一样的赛道,我们需要使用 $multiset$ 。
需要注意的是,我们需要对每个节点开一个 $multiset$ ,以此来确保每一个节点所代表的子树在处理时互不影响。
1 |
|
总结
对于贪心还是不太熟练,自己想了半天还是没有想出做法,还是翻了题解。该打